package com.xiaolun.assist;

import java.util.concurrent.CountDownLatch;

/**
 * @Description: 让一些线程阻塞直到另一些线程完成一系列操作后才被唤醒。
 * 控制线程顺序
 * <p>
 * CountDownLatch主要有两个方法，当一个或多个线程调用await方法时，这些线程会阻塞。
 * 其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞)，
 * 当计数器的值变为0时，因await方法阻塞的线程会被唤醒，继续执行。
 * <p>
 * 题目：6个同学陆续离开教室后,最后班长才可以关门。
 * main主线程必须要等前面6个线程完成全部工作后，自己才能开干。
 */
public class CountDownLatchDemo01 {
	public static void main(String[] args) throws InterruptedException {
		//6个计数
		CountDownLatch countDownLatch = new CountDownLatch(6);

		//开启六个线程，模拟6个同学
		for (int i = 1; i <= 6; i++) {
			new Thread(() -> {
				System.out.println(Thread.currentThread().getName() + "\t 离开教室");
				//离开一个，计算减少一个
				countDownLatch.countDown();
			}, String.valueOf(i)).start();
		}
		countDownLatch.await(); //主线程阻塞，等到 countDownLatch.countDown();为0
		System.out.println(Thread.currentThread().getName() + "\t班长关门走人");
	}
}
